//
// Created by Jeffrey Wei on 2022/11/1.
// 项目通用的路由服务,为核心库通用微服务的一部分
// 注册一组RouterType到服务中去,实现url路由和外部跳转的功能,
// 推荐继承并内置所有routerTypes,也可采用构造函数传入一组RouterType

import Foundation
import URLNavigator

open class RouterService: NSObject, Service {
    private let routerTypes: [RouterType]

    public init(routerTypes: [RouterType]) {
        self.routerTypes = routerTypes
        super.init()
    }

    public func start(launchOptions _: [UIApplication.LaunchOptionsKey: Any]?) {
        routerTypes.forEach { AppContext.navigator.register($0.pattern, $0.getRouterViewController) }
        routerTypes.forEach { AppContext.navigator.handle($0.pattern, $0.openHande) }
    }

    public func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
        if AppContext.navigator.open(url) == true {
            return true
        }
        if AppContext.navigator.push(url) != nil {
            return true
        }
        return false
    }
}

public protocol RouterType {
    /// 匹配的pattern,实际为字符类型
    var pattern: URLPattern { get }
    ///
    /// router协议控制器,通过参数构造一个控制器,内部可通过必要构造函数构造
    /// - Parameters:
    ///   - url:跳转的url
    ///   - values:url上的参数(具体查看URLNavigator文档,该参数不是?后的参数,?后&拼接的参数调用queryParameters即可
    ///   - context:上下文,跳转的时候传入,组件化之间跳转可使用,但url跳转不推荐
    func getRouterViewController(url: URLConvertible, values: [String: Any], context: Any?) -> UIViewController?

    ///
    /// navigator调用open后的处理函数,默认实现为false,自定义跳转可实现此函数,例如tabBar的切换等
    /// - Parameters:
    ///   - url:跳转的url
    ///   - values:url上的参数(具体查看URLNavigator文档,该参数不是?后的参数,?后&拼接的参数调用queryParameters即可
    ///   - context:上下文,跳转的时候传入,组件化之间跳转可使用,但url跳转不推荐
    /// - Returns:是否能跳转
    func openHande(_ url: URLConvertible, _ values: [String: Any], _ context: Any?) -> Bool
}
